﻿# student_extension.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
文件名称: student_extension.py
完整存储路径: backend/models/student_extension.py
功能说明:
    定义 StudentExtension 模型，用于存储学生扩展信息，包含随时间变化的数据字段，
    主要是健康信息。该模型支持同一学生在不同数据年份下拥有多条记录，
    但通过复合唯一约束，确保每个 student_id 与 data_year 的组合在数据库中只存在一条记录。
使用说明:
    通过 SQLAlchemy ORM 对学生扩展数据进行 CRUD 操作，各字段命名、数据类型和长度依据项目需求设计，
    并与数据导入、查询等模块保持一致。请在重建数据库时确保旧数据已清除，以便新结构正常生成。
"""

from datetime import datetime
from backend.infrastructure.database import db
from sqlalchemy import UniqueConstraint, CheckConstraint

class StudentExtension(db.Model):
    __tablename__ = "student_extensions"
    __table_args__ = (
        CheckConstraint("data_year REGEXP '^[0-9]{4}$'", name='chk_data_year_format'),
        UniqueConstraint('student_id', 'data_year', name='uq_student_year'),
    )

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    student_id = db.Column(db.Integer, db.ForeignKey("students.id", ondelete="CASCADE"), nullable=False, comment="关联的学生ID")
    data_year = db.Column(db.String(4), nullable=False, comment="数据年份")
    grade = db.Column(db.String(10), nullable=True, comment="学生年级（随数据年份变化）")
    age = db.Column(db.Integer, nullable=True, comment="年龄")
    
    # 健康信息
    height = db.Column(db.Float, nullable=True, comment="身高（单位：厘米）")
    weight = db.Column(db.Float, nullable=True, comment="体重（单位：公斤）")
    diet_preference = db.Column(db.String(50), nullable=True, comment="饮食偏好")
    exercise_preference = db.Column(db.String(50), nullable=True, comment="运动偏好")
    health_education = db.Column(db.String(200), nullable=True, comment="健康教育情况")
    past_history = db.Column(db.String(200), nullable=True, comment="既往史")
    family_history = db.Column(db.String(200), nullable=True, comment="家族史")
    premature = db.Column(db.String(10), nullable=True, comment="是否早产")
    allergy = db.Column(db.String(200), nullable=True, comment="过敏史")
    
    # 新增矫正方式字段（多选项：框架眼镜、隐形眼镜、夜戴角膜塑形镜）
    correction_method = db.Column(db.String(100), nullable=True, comment="矫正方式")
    
    # ✅新增：具体矫正方式字段（技术文档B要求）
    frame_glasses = db.Column(db.Boolean, nullable=True, default=False, comment="框架眼镜")
    contact_lenses = db.Column(db.Boolean, nullable=True, default=False, comment="隐形眼镜") 
    night_orthokeratology = db.Column(db.Boolean, nullable=True, default=False, comment="夜戴角膜塑型镜")

    # 关系定义 - 修复back_populates不匹配问题
    student = db.relationship("Student", back_populates="extensions")

    def to_dict(self):
        """
        将模型转换为前端友好的字典格式，便于 JSON 序列化展示
        """
        result = {}
        for column in self.__table__.columns:
            value = getattr(self, column.name)
            if isinstance(value, datetime):
                result[column.name] = value.isoformat() if value else None
            else:
                result[column.name] = value
        
        # 添加学生基本信息
        if self.student:
            result['student_info'] = self.student.to_dict()
        
        return result

    def __repr__(self):
        return f"<StudentExtension {self.student_id}-{self.data_year}>"